#include <iostream>
#include <vector>
#include <queue>
#include <tuple>
using namespace std;

class Solution {
public:
    int kthSmallest(vector<vector<int>>& matrix, int k) {
        int n = matrix.size();
        int left = matrix[0][0], right = matrix[n - 1][n - 1];

        while (left < right) {
            int mid = left + (right - left) / 2;
            int count = countLessEqual(matrix, mid);

            if (count >= k) {
                right = mid; // 第 k 小的元素在左半部分
            } else {
                left = mid + 1; // 第 k 小的元素在右半部分
            }
        }

        return left;
    }

private:
    // 统计矩阵中小于等于 target 的元素个数
    int countLessEqual(const vector<vector<int>>& matrix, int target) {
        int n = matrix.size();
        int count = 0;
        int row = n - 1, col = 0;

        while (row >= 0 && col < n) {
            if (matrix[row][col] <= target) {
                count += row + 1; // 当前列的所有元素都小于等于 target
                col++;
            } else {
                row--; // 移动到上一行
            }
        }

        return count;
    }
};

int main() {
    // 读取矩阵大小和目标值
    int n, k;
    cin >> n >> k;

    // 读取矩阵
    vector<vector<int>> matrix(n, vector<int>(n));
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < n; ++j) {
            cin >> matrix[i][j];
        }
    }

    // 计算第 k 小的元素
    Solution solution;
    int result = solution.kthSmallest(matrix, k);

    // 输出结果
    cout << result << endl;

    return 0;
}
